import * as child_process from "child_process";
import { TaskQuene } from "./TaskQuene";
/** 
 * 执行shell命令的工具 
 * @author 赵占涛
 */
export class ShellUtil {
    private static taskQuene = new TaskQuene(1);
    /**
     * 执行shell命令
     * @param cmd 要执行的命令
     * @param cb 成功后的回调，失败后程序会终止，不会回调
     */
    static exec(cmd: string, cb: (log: string) => void) {
        this.taskQuene.do((completeCb: () => void) => {
            child_process.exec(cmd, { maxBuffer: 200000000 }, (error, stdout, stderr) => {
                if (error) {
                    console.log("cmd", cmd);
                    throw error;
                }
                // console.log(stdout);
                completeCb();
                cb(stdout);
            });
        });
    }
    /**
     * 执行shell命令(用于大量输出，且输出需要打印的情况)
     * @param cmd 要执行的命令（只能是单个命令，不能是一行shell)
     * @param data 命令的参数
     * @param cb 成功后的回调，失败后程序会终止，不会回调
     */
    static spawn(cmd: string, data: string[], cb: () => void) {
        this.taskQuene.do((completeCb: () => void) => {
            let spawnObj = child_process.spawn(cmd, data);

            spawnObj.stdout.on('data', (data) => {
                console.log(`stdout: ${data}`);
            });

            spawnObj.stderr.on('data', (data) => {
                console.error(`stderr: ${data}`);
                throw new Error("程序错误"+data);
            });

            spawnObj.on('close', (code) => {
                if (code == 0) {
                    completeCb();
                    cb();
                } else {
                    throw new Error("程序错误退出");
                }
            });
        });
    }
}